package pos.data;

import pos.domain.*;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pos.domain.Ruta;
import pos.domain.Usuario;

public class JDBCRutaDAO implements IRutaDAO{
	
	Connection conn = ConnectionManager.getInstance().checkOut();

	@Override
	public void insert(Ruta ruta) {
		String sql = "INSERT INTO ruta (nombre,descripcion,idUsuario) VALUES (?,?,?) ";
		PreparedStatement stmt = null;

		try {
			String nombre =ruta.getNombre();
			String desc = ruta.getDescripcion();
			int idUsuario = ruta.getUsuario().getIdUsuario();
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			stmt.setString(2, desc);
			stmt.setInt(3, idUsuario);
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}	
	}

	public void insertarCallesRuta(Ruta ruta){
		String sql = "INSERT INTO calleRuta (idRuta,idCalle,orden) VALUES (?,?,?) ";
		PreparedStatement stmt = null;

		try {
			int contador=1;
			for(Calle c:ruta.getCalles()){
				stmt = conn.prepareStatement(sql);
				stmt.setInt(1, ruta.getIdRuta());
				stmt.setInt(2, c.getIdCalle());
				stmt.setInt(3, contador);
				stmt.executeUpdate();
				contador++;
			}

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}
	@Override
	public List<Ruta> getRutaByUser(Usuario usuario) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Ruta ruta = null;
		String sql = "SELECT * FROM ruta WHERE idUsuario = ?";
		List<Ruta> lista = new ArrayList<Ruta>();
		List<Calle> listaCalle = new ArrayList<Calle>();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, usuario.getIdUsuario());
			result = stmt.executeQuery();

			while(result.next()){
				ruta = new Ruta();
				ruta.setNombre(result.getString("nombre"));
				ruta.setDescripcion(result.getString("descripcion"));
				ruta.setUsuario(usuario);
				ruta.setIdRuta(result.getInt("idRuta"));
				listaCalle = selectCallesRuta(ruta);
				ruta.setCalles(listaCalle);
				lista.add(ruta);
			}
				
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}
	
	private List<Calle> selectCallesRuta(Ruta ruta){
		JDBCCalleDAO calleDao = new JDBCCalleDAO();
		PreparedStatement stmt = null;
		ResultSet result = null;
		Calle calle = null;
		String sql = "SELECT * FROM calleruta WHERE idRuta = ?";
		List<Calle> lista = new ArrayList<Calle>();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, ruta.getIdRuta());
			result = stmt.executeQuery();

			while(result.next()){
				int idCalle = result.getInt("idCalle");
				calle = calleDao.selectByID(idCalle);
				lista.add(calle);
			}
				
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public Ruta getRutaById(int idRuta) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Ruta ruta = null;
		String sql = "SELECT * FROM ruta WHERE idRuta = ?";
		List<Calle> listaCalle = new ArrayList<Calle>();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idRuta);
			result = stmt.executeQuery();
			if(result.next()){
				ruta = new Ruta();
				ruta.setIdRuta(idRuta);
				ruta.setDescripcion(result.getString("descripcion"));
				ruta.setNombre(result.getString("nombre"));
				//ruta.setUsuario(usuario);
				listaCalle = selectCallesRuta(ruta);
				ruta.setCalles(listaCalle);
			}
			
				
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return ruta;
	}
 
}
